SĂŒgav sukeldumine Pythoni logimisraamistikku: avastage kĂ€sitlejate konfigureerimist, kohandatud vormindajaid, praktilisi nĂ€iteid ja parimaid tavasid robustseks ja tĂ”husaks logimiseks oma rakendustes.
Pythoni logimisraamistik: kÀsitlejate (Handler) konfigureerimine vs. kohandatud vormindajad (Formatter)
Pythoni logimisraamistik on vĂ”imas tööriist rakenduse kĂ€itumise haldamiseks ja jĂ€lgimiseks. TĂ”hus logimine on oluline silumiseks, vigade otsimiseks ja tarkvara jĂ”udluse kohta ĂŒlevaate saamiseks. See pĂ”hjalik juhend sĂŒveneb kahte Pythoni logimisraamistiku vĂ”tmeaspekti: kĂ€sitlejate (Handler) konfigureerimine ja kohandatud vormindajad (Custom Formatters). Uurime nende funktsionaalsust, parimaid tavasid ja praktilisi nĂ€iteid, et aidata teil rakendada oma Pythoni projektides robustset ja tĂ”husat logimist, olenemata teie asukohast ĂŒle maailma.
Pythoni logimise pÔhitÔdede mÔistmine
Enne kĂ€sitlejatesse ja vormindajatesse sĂŒvenemist loome kindla arusaama Pythoni logimisraamistiku pĂ”hikomponentidest:
- Logijad (Loggers): Logijad on peamine liides, mille kaudu teie rakendus kirjutab logisÔnumeid. Need on hierarhilised, mis tÀhendab, et logijal vÔivad olla alluvad logijad, kes pÀrivad konfiguratsiooni oma vanematelt. MÔelge neist kui oma logisÔnumite vÀravavahtidest.
- Logitasemed (Log Levels): Logitasemed (DEBUG, INFO, WARNING, ERROR, CRITICAL) kategoriseerivad logisÔnumite tÔsidust. Neid tasemeid kasutatakse selleks, et filtreerida, milliseid sÔnumeid töödeldakse. NÀiteks tootmiskeskkonnas vÔiksite logida ainult WARNING, ERROR ja CRITICAL taseme sÔnumeid, et vÀhendada detailsust.
- KÀsitlejad (Handlers): KÀsitlejad mÀÀravad, kuhu logisÔnumid saadetakse. See vÔib olla konsool (stdout), fail, vÔrgusokkel vÔi isegi andmebaas. KÀsitlejaid saab konfigureerida filtreerima logitaseme jÀrgi ja rakendama vormindajaid.
- Vormindajad (Formatters): Vormindajad defineerivad teie logisÔnumite struktuuri ja sisu. Nad kontrollivad, milline teave lisatakse (ajatempe, logija nimi, logitase, sÔnumi sisu jne) ja kuidas see esitatakse. Vormindajaid rakendab kÀsitleja enne logisÔnumi kirjutamist.
Need komponendid töötavad koos, et pakkuda paindlikku ja konfigureeritavat logimissĂŒsteemi. LogisĂ”num saab alguse logijast, lĂ€bib kĂ€sitleja ja vormindatakse vormindaja abil enne sihtkohta saatmist. See struktuur vĂ”imaldab detailset kontrolli selle ĂŒle, kuidas logisid genereeritakse, töödeldakse ja salvestatakse.
KÀsitlejate konfigureerimine: oma logide tÔhus suunamine
KĂ€sitlejad on logimisraamistiku tööhobused, kes vastutavad teie logisĂ”numite suunamise eest nende lĂ”ppsihtkohta. Korralik kĂ€sitlejate konfigureerimine on tĂ”husa logimise jaoks ĂŒlioluline. Siin on ĂŒlevaade peamistest kaalutlustest:
Levinud kĂ€sitlejatĂŒĂŒbid:
- StreamHandler: Saadab logisÔnumid voogu, tavaliselt stdout vÔi stderr. Ideaalne konsoolilogimiseks arenduse ajal.
- FileHandler: Kirjutab logisĂ”numid faili. Oluline rakenduse sĂŒndmuste pĂŒsivaks logimiseks, eriti tootmises. See on ĂŒlioluline probleemide silumiseks, mis ilmnevad pĂ€rast rakenduse kasutuselevĂ”ttu.
- RotatingFileHandler: FileHandleri alamklass, mis pöörab logifaile automaatselt, kui need jĂ”uavad teatud suuruseni vĂ”i kindlate ajavahemike jĂ€rel. Hoiab Ă€ra ĂŒksikute logifailide lĂ”putu kasvu, parandades jĂ”udlust ja hallatavust.
- TimedRotatingFileHandler: Sarnane RotatingFileHandlerile, kuid pöörab logisid aja alusel (pÀevas, nÀdalas jne). Kasulik logide kuupÀeva jÀrgi organiseerimiseks.
- SocketHandler: Saadab logisĂ”numid ĂŒle vĂ”rgusokli. VĂ”imaldab kauglogimist, mis lubab tsentraliseerida logisid mitmest rakendusest.
- SMTPHandler: Saadab logisÔnumid e-posti teel. Kasulik kriitiliste vigade vÔi hoiatuste kohta teavitamiseks.
KĂ€sitlejate konfigureerimine Pythonis:
KĂ€sitlejate konfigureerimiseks on kaks peamist viisi:
- Programmaatiline konfigureerimine: See hĂ”lmab kĂ€sitlejate eksemplaride loomist otse oma Pythoni koodis ja nende lisamist logijatele. See lĂ€henemine pakub kĂ”ige rohkem paindlikkust ja kontrolli, vĂ”imaldades teil dĂŒnaamiliselt kohandada logimiskĂ€itumist vastavalt rakenduse vajadustele.
- Konfiguratsioonifailid (nt YAML, JSON, INI): Konfiguratsioonifailide kasutamine vÔimaldab teil eraldada logimise seadistuse oma rakenduse koodist, mis teeb logimisseadete haldamise ja muutmise lihtsamaks ilma koodi muutmata. See on eriti kasulik juurutuskeskkondades.
Programmaatilise kÀsitleja nÀide:
Illustreerime programmaatilist konfigureerimist lihtsa nĂ€itega, mis kirjutab konsooli ja faili. See nĂ€ide demonstreerib pĂ”histruktuuri. Ărge unustage kohandada failiteid ja logitasemeid vastavalt oma projekti vajadustele.
import logging
# Loome logija
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG) # Seadistame juurlogija taseme
# Loome kÀsitleja konsooli printimiseks (stdout)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # Seadistame taseme sellele kÀsitlejale
# Loome kÀsitleja faili kirjutamiseks
file_handler = logging.FileHandler('my_app.log')
file_handler.setLevel(logging.DEBUG) # Logime kÔik faili
# Loome vormindajad (selgitatud hiljem)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# Lisame kÀsitlejad logijale
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# NÀidislogisÔnumid
logger.debug('See on silumissÔnum')
logger.info('See on infosÔnum')
logger.warning('See on hoiatussÔnum')
logger.error('See on veasÔnum')
logger.critical('See on kriitiline sÔnum')
NÀite vÔtmepunktid:
- Loome logija eksemplari, kasutades
logging.getLogger(). Argumendiks on tavaliselt mooduli nimi vÔi rakendusepÔhine nimi. - Seadistame logitaseme juurlogijale (antud juhul 'my_app'). See mÀÀrab *minimaalse* tÔsidustaseme sÔnumitele, mida logija töötleb.
- Loome kaks kĂ€sitlejat: ĂŒhe konsooli (StreamHandler) ja ĂŒhe faili jaoks (FileHandler).
- Seadistame taseme *igale* kĂ€sitlejale. See vĂ”imaldab filtreerimist. NĂ€iteks konsooli kĂ€sitleja vĂ”ib kuvada ainult INFO ja kĂ”rgema taseme sĂ”numeid, samas kui failikĂ€sitleja salvestab kĂ”ik sĂ”numid (DEBUG ja ĂŒlespoole).
- Lisame igale kĂ€sitlejale vormindaja (selgitatud ĂŒksikasjalikult allpool).
- Lisame kÀsitlejad logijale, kasutades
logger.addHandler(). - Kasutame logijat erinevatel tasemetel logisÔnumite genereerimiseks.
Konfiguratsioonifaili nÀide (YAML):
Konfiguratsioonifaili (nt YAML) kasutamine vÔimaldab teil oma logimisseadistuse mÀÀratleda vÀliselt, mis teeb logimiskÀitumise muutmise lihtsaks ilma koodi muutmata. Siin on nÀide, mis kasutab logging.config.dictConfig() funktsiooni:
import logging
import logging.config
import yaml
# Laadime konfiguratsiooni YAML-failist
with open('logging_config.yaml', 'r') as f:
config = yaml.safe_load(f)
# Konfigureerime logimise
logging.config.dictConfig(config)
# Saame logija (nimi peaks vastama konfiguratsioonifailis mÀÀratletule)
logger = logging.getLogger('my_app')
# NÀidislogisÔnumid
logger.debug('See on silumissÔnum konfiguratsioonist')
logger.info('See on infosÔnum konfiguratsioonist')
Ja siin on nÀidisfail logging_config.yaml:
version: 1
formatters:
simple:
format: '%(levelname)s - %(message)s'
detailed:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
file:
class: logging.FileHandler
level: DEBUG
formatter: detailed
filename: my_app_config.log
loggers:
my_app:
level: DEBUG
handlers: [console, file]
propagate: no
root:
level: WARNING # Vaikeseaded, kui logijas pole mÀÀratud.
YAML-konfiguratsiooni selgitus:
version: 1: MÀÀrab konfiguratsioonifaili versiooni.formatters: MÀÀratleb saadaolevad vormindajad.handlers: MÀÀratleb kÀsitlejad. Iga kÀsitleja mÀÀrab oma klassi, taseme, vormindaja ja sihtkoha (nt konsool, fail).loggers: MÀÀratleb logijad. Siin konfigureerime 'my_app' logija kasutama nii 'console' kui ka 'file' kÀsitlejaid. Samuti seadistame selle logitaseme.root: Vaikimisi konfiguratsioon, kui logijates pole mÀÀratud.
Konfiguratsioonifailide peamised eelised:
- Huvide lahusus (Separation of Concerns): Hoiab teie logimiskonfiguratsiooni lahus teie pÔhirakenduse loogikast.
- Lihtne muuta: LogimiskÀitumise muutmine (nt logitasemed, vÀljundi sihtkohad) nÔuab ainult konfiguratsioonifaili, mitte teie koodi muutmist.
- Juurutamise paindlikkus: VÔimaldab teil hÔlpsasti kohandada logimist erinevatele keskkondadele (arendus, testimine, tootmine).
Kohandatud vormindajad: oma logisÔnumite rÀtsepatöö
Vormindajad kontrollivad teie logisĂ”numite struktuuri ja sisu. Need vĂ”imaldavad teil kohandada oma logides kuvatavat teavet, muutes rakenduse kĂ€itumise mĂ”istmise ja analĂŒĂŒsimise lihtsamaks. Vormindajad mÀÀravad, millised ĂŒksikasjad lisatakse (ajatempe, logija nimi, logitase, sĂ”num jne) ja kuidas need esitatakse.
Vormindaja komponentide mÔistmine:
Vormindajad kasutavad vormindusstringi, mis mÀÀratleb, kuidas logikirjeid vormindatakse. Siin on mÔned levinumad vormindusspetsifikaatorid:
%(asctime)s: Aeg, millal logikirje loodi (nt '2024-01-01 12:00:00,000').%(name)s: Logija nimi (nt 'my_app.module1').%(levelname)s: Logitase (nt 'INFO', 'WARNING', 'ERROR').%(message)s: LogisÔnum.%(filename)s: Failinimi, kust logisÔnum pÀrineb.%(lineno)d: Reanumber, kust logisÔnum pÀrineb.%(funcName)s: Funktsiooni nimi, kust logisÔnum pÀrineb.%(pathname)s: LÀhtefaili tÀielik tee.%(threadName)s: LÔime (thread) nimi.%(process)d: Protsessi ID.
Kohandatud vormindajate loomine:
Saate luua kohandatud vormindajaid, et lisada oma rakenduse vajadustele kohandatud spetsiifilist teavet. See saavutatakse, luues alamklassi logging.Formatter klassist ja alistades selle format() meetodi. format() meetodi sees saate juurde pÀÀseda logikirje atribuutidele ja vormindada sÔnumit vastavalt vajadusele.
import logging
class CustomFormatter(logging.Formatter):
def format(self, record):
# Saame algse vormindatud sÔnumi
log_fmt = super().format(record)
# Lisame kohandatud teabe
custom_info = f' - Kasutaja: {record.user_id if hasattr(record, "user_id") else "KĂŒlaline"}' # NĂ€idiskohandus
return log_fmt + custom_info
# KasutusnÀide (Illustreeriv: nÔuab kÀsitleja seadistamist ja kohandatud vormindaja lisamist)
if __name__ == '__main__':
logger = logging.getLogger('custom_logger')
logger.setLevel(logging.INFO)
# Loome konsoolikÀsitleja
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# Seadistame kÀsitlejale kohandatud vormindaja
formatter = CustomFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
# Lisame kÀsitleja logijale
logger.addHandler(ch)
# Loome logikirje kohandatud atribuudiga (demonstreerimiseks simuleeritud)
class LogRecordWithUser(logging.LogRecord):
def __init__(self, name, level, pathname, lineno, msg, args, exc_info, func, sinfo, user_id=None):
super().__init__(name, level, pathname, lineno, msg, args, exc_info, func, sinfo)
self.user_id = user_id
# NÀidissÔnum kasutaja ID-ga
record = LogRecordWithUser('custom_logger', logging.INFO, 'example.py', 10, 'Kasutaja logis sisse', (), None, 'main', None, user_id='12345')
logger.handle(record)
# NÀidissÔnum ilma kasutaja ID-ta
logger.info('KĂŒlaliskasutaja kĂŒlastas lehte.')
Kohandatud vormindaja nÀite selgitus:
- Loome klassi nimega
CustomFormatter, mis pÀrib klassistlogging.Formatter. format()meetod on alistatud. Siin asub kohandatud vormindamisloogika.- KÔigepealt saame standardse vormindatud sÔnumi, kasutades
super().format(record). - Lisame kohandatud teavet. Selles nĂ€ites lisame kasutajateabe (kasutaja ID), kui see eksisteerib logikirje atribuudina. Kui ei (nagu kĂŒlaliskasutaja puhul), kuvatakse "KĂŒlaline". Pange tĂ€hele, kuidas
hasattr()kontroll ja user_id atribuudi tingimuslik lisamine aitab vÀltida vigu juhtudel, kus atribuut pole mÀÀratletud. - NÀide demonstreerib, kuidas kÀsitleda logisÔnumit, et lisada teavet hetkel sisse logitud kasutaja kohta.
LogisÔnumite vormindamine erinevateks kasutusjuhtudeks:
Siin on mÔned nÀited erinevatest vormindajastiilidest, et aidata teil valida oma vajadustele sobivaim vorming.
- PÔhivorming (arenduseks):
See vorming pakub lihtsat ajatemplit, logitaset ja sÔnumit. Hea kiireks silumiseks.
'%(asctime)s - %(levelname)s - %(message)s' - Detailne vorming (tootmiseks, faili/rea numbriga):
See vorming sisaldab logija nime, failinime, rea numbrit ja logisÔnumit, mis teeb logide allika jÀlitamise lihtsamaks.
'%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s' - JSON-vorming (masinloetavaks töötlemiseks):
Automatiseeritud logianalĂŒĂŒsi jaoks (nt logide koondamise sĂŒsteemiga) on JSON-vorming vĂ€ga tĂ”hus. See vĂ”imaldab struktureeritud andmeid, mis teeb parsimise ja analĂŒĂŒsi lihtsamaks. Peate looma kohandatud vormindaja klassi ja kasutama
json.dumps(), et kodeerida logikirje JSON-iks.import json import logging class JsonFormatter(logging.Formatter): def format(self, record): log_record = { 'timestamp': self.formatTime(record, self.datefmt), 'name': record.name, 'levelname': record.levelname, 'message': record.getMessage(), 'filename': record.filename, 'lineno': record.lineno, 'funcName': record.funcName } return json.dumps(log_record)See vormindaja loob JSON-struktuuri, mis sisaldab asjakohaseid logiandmeid. Fail, rea number ja funktsiooni nimi vĂ”imaldavad lĂ€htekoodis lihtsat tagasijĂ€litamist. See vormindatud vĂ€ljund on seejĂ€rel logianalĂŒĂŒsi tööriistade poolt kergesti parsitatav.
- Vormindamine spetsiifilistele rakendustele:
Kohandage oma vormindajaid, et lisada kontekstispetsiifilist teavet. Kui teie rakendus tegeleb kasutajate autentimisega, lisage kasutaja ID-d. Kui töötlete finantstehinguid, lisage tehingu ID-d. Kohandage oma logimisvĂ€ljundit vastavalt sellele, mis on teie Ă€rikontekstis kasulik ja millist tĂŒĂŒpi probleemidega te kĂ”ige tĂ”enĂ€olisemalt kokku puutute.
Pythoni logimise parimad tavad
Parimate tavade jÀrgimine tagab, et teie logimine on tÔhus, hooldatav ja vÀÀrtuslik. Siin on mÔned peamised soovitused:
- Logitaseme granulaarsus: Kasutage asjakohaseid logitasemeid jÀrjepidevalt.
DEBUG: Detailne teave, tavaliselt silumiseks.INFO: Ăldine teave rakenduse toimimise kohta.WARNING: Potentsiaalsed probleemid vĂ”i ootamatud sĂŒndmused.ERROR: Vead, mis takistavad mĂ”ne funktsiooni vĂ”i funktsionaalsuse toimimist.CRITICAL: TĂ”sised vead, mis vĂ”ivad pĂ”hjustada rakenduse kokkujooksmise vĂ”i ebastabiilseks muutumise.
Valige tase, mis peegeldab tĂ€pselt logitud sĂŒndmuse tĂ”sidust.
- Kontekstuaalne teave: Lisage oma logisÔnumitesse asjakohane kontekst. Lisage kasutaja ID-d, pÀringu ID-d, tehingu ID-d vÔi mis tahes muud teavet, mis aitab teil probleemi algallikani jÀlitada.
- Vigade kÀsitlemine: Logige erandeid alati, kasutades
logger.exception()vĂ”i lisades erandi teabe logisĂ”numisse. See annab virnajĂ€lgi (stack traces), mis on silumiseks hindamatud. - Tsentraliseeritud logimine (hajussĂŒsteemide jaoks): Kaaluge tsentraliseeritud logimissĂŒsteemi (nt Elasticsearch, Fluentd, Splunk vĂ”i ELK stack -- Elasticsearch, Logstash ja Kibana) kasutamist. See vĂ”imaldab teil koondada logisid mitmest rakendusest ja serverist, mis teeb sĂŒsteemide otsimise, analĂŒĂŒsimise ja jĂ€lgimise lihtsamaks. Pilvandmetöötluse maailmas pakuvad mitmesugused teenused hallatud logimist, nt AWS CloudWatch, Azure Monitor ja Google Cloud Logging.
- Pööramine ja sÀilitamine: Rakendage logide pööramist (kasutades
RotatingFileHandlervĂ”iTimedRotatingFileHandler), et vĂ€ltida logifailide liiga suureks kasvamist. Kehtestage sĂ€ilituspoliitika, et logisid automaatselt kustutada vĂ”i arhiveerida pĂ€rast kindlaksmÀÀratud perioodi. See on oluline vastavuse, turvalisuse ja salvestusruumi haldamise seisukohast. - VĂ€ltige tundlikku teavet: Ărge kunagi logige tundlikku teavet, nagu paroolid, API-vĂ”tmed vĂ”i isikuandmed. Tagage vastavus privaatsuseeskirjadele nagu GDPR vĂ”i CCPA. Rakendage hoolikat filtreerimist, kui rakendus kĂ€sitleb tundlikke andmeid.
- KonfiguratsioonipÔhine logimine: Kasutage oma logimisseadete haldamiseks konfiguratsioonifaile (YAML, JSON vÔi INI). See teeb logitasemete, kÀsitlejate ja vormindajate muutmise lihtsamaks ilma koodi muutmata, vÔimaldades teil kohandada logimist erinevatele keskkondadele.
- JÔudluse kaalutlused: VÀltige liigset logimist, eriti oma koodi jÔudluskriitilistes osades. Logimine vÔib tekitada lisakoormust, seega olge teadlik mÔjust rakenduse jÔudlusele. Kasutage sobivaid logitasemeid ja filtreerige sÔnumeid vastavalt vajadusele.
- Logimise testimine: Kirjutage ĂŒhikteste, et kontrollida oma logimiskonfiguratsiooni ja seda, et teie logisĂ”numid genereeritakse Ă”igesti. Kaaluge erinevate logitasemete ja stsenaariumide testimist, et tagada korrektne toimimine.
- Dokumentatsioon: Dokumenteerige oma logimiskonfiguratsioon, sealhulgas logitasemed, kÀsitlejad ja vormindajad. See aitab teistel arendajatel mÔista teie logimisseadistust ning teeb teie koodi hooldamise ja vigade otsimise lihtsamaks.
- Kasutaja ID ja pÀringu ID korrelatsioon: Veebirakenduste vÔi mitut pÀringut kÀsitlevate teenuste puhul genereerige unikaalne pÀringu ID ja lisage see igasse logisÔnumisse, mis on seotud konkreetse pÀringuga. Samamoodi lisage vajadusel kasutaja ID. See aitab jÀlgida pÀringuid mitme teenuse vahel ja siluda konkreetsete kasutajatega seotud probleeme.
Praktilised nÀited ja kasutusjuhud
Uurime mĂ”ningaid reaalseid stsenaariume, kus tĂ”hus logimine on ĂŒlioluline:
1. Veebirakenduse monitooring:
Veebirakenduses saate kasutada logimist kasutajapÀringute jÀlgimiseks, vigade jÀlitamiseks ja jÔudluse kitsaskohtade tuvastamiseks.
import logging
from flask import Flask, request
app = Flask(__name__)
# Konfigureerime logimise (kasutades konfiguratsioonifaili vÔi siin programmaatilist nÀidet)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
@app.route('/')
def index():
# Genereerime pÀringu ID (nÀiteks)
request_id = request.headers.get('X-Request-Id')
if not request_id:
request_id = 'unknown'
logger.info(f'PÀring vastu vÔetud, pÀringu ID: {request_id}')
try:
# Simuleerime veaolukorda
if request.args.get('error'):
raise ValueError('Simuleeritud viga')
return 'Hello, World!'
except Exception as e:
logger.error(f'Viga pÀringu {request_id} töötlemisel: {str(e)}')
return 'Internal Server Error', 500
if __name__ == '__main__':
app.run(debug=True) # Olge tootmises debug=True kasutamisega vÀga ettevaatlik.
Selles nÀites me:
- Genereerime (vĂ”i vĂ”tame vastu) pĂ€ringu ID, et jĂ€lgida ĂŒksikuid pĂ€ringuid.
- Logime pÀringu koos pÀringu ID-ga.
- Logime kÔik vead, sealhulgas erandi ja pÀringu ID.
2. TaustaĂŒlesanded / Ajastatud tööd:
Logimine on kriitilise tĂ€htsusega taustaĂŒlesannete, nĂ€iteks ajastatud tööde vĂ”i andmetöötluskonveierite jĂ€lgimisel.
import logging
import time
from datetime import datetime
# Konfigureerime logimise (jĂ€llegi, konfiguratsioonifaili kasutamine on ĂŒldiselt parem)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def my_scheduled_task():
start_time = datetime.now()
logger.info(f'Ajastatud ĂŒlesande alustamine kell {start_time}')
try:
# Simuleerime tööd
time.sleep(2) # Simuleerime tööd
# Simuleerime potentsiaalset viga
if datetime.now().minute % 5 == 0:
raise ValueError('Simuleeritud viga ĂŒlesandes')
logger.info('Ălesanne edukalt lĂ”petatud')
except Exception as e:
logger.error(f'Ălesanne ebaĂ”nnestus: {str(e)}')
finally:
end_time = datetime.now()
logger.info(f'Ălesanne lĂ”ppes kell {end_time}. Kestus: {end_time - start_time}')
if __name__ == '__main__':
my_scheduled_task()
See nĂ€itab logimist enne, durante ja pĂ€rast ĂŒlesande tĂ€itmist, nĂ€idates nii edu kui ka ebaĂ”nnestumist. See teeb ajastamisprobleemide diagnoosimise lihtsaks.
3. Andmetöötluskonveier:
Andmetöötluskonveieris aitab logimine teil jĂ€lgida andmete teisendusi, tuvastada vigu ja jĂ€lgida konveieri ĂŒldist seisundit.
import logging
import pandas as pd
# Konfigureerime logimise
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def load_data(file_path):
try:
df = pd.read_csv(file_path) # Asendage oma failitĂŒĂŒbiga
logger.info(f'Andmed laaditud asukohast {file_path}, kuju: {df.shape}')
return df
except FileNotFoundError:
logger.error(f'Faili ei leitud: {file_path}')
return None
except Exception as e:
logger.error(f'Viga andmete laadimisel: {str(e)}')
return None
def transform_data(df):
if df is None:
return None
try:
# Rakendame teisenduse
df['processed_column'] = df['some_column'] * 2 # NĂ€ide
logger.info('Andmete teisendamine lÔpetatud.')
return df
except Exception as e:
logger.error(f'Viga andmete teisendamisel: {str(e)}')
return None
def save_data(df, output_file):
if df is None:
return
try:
df.to_csv(output_file, index=False) # Muutke teise vÀljundvormingu jaoks
logger.info(f'Andmed salvestatud asukohta {output_file}')
except Exception as e:
logger.error(f'Viga andmete salvestamisel: {str(e)}')
# KasutusnÀide (asendage oma tegelike failiteede ja andmetega)
if __name__ == '__main__':
input_file = 'input.csv'
output_file = 'output.csv'
data = load_data(input_file)
transformed_data = transform_data(data)
save_data(transformed_data, output_file)
See konveieri nÀide logib andmete laadimist, teisendamist ja salvestamist. Logimislaused vÔimaldavad teil protsessi jÀlgida ja probleeme kergesti diagnoosida, kui midagi valesti lÀheb.
TĂ€iustatud logimistehnikad
Lisaks pÔhitÔdedele kaaluge oma logimisvÔimaluste maksimeerimiseks neid tÀiustatud tehnikaid:
- Kontekstimuutujate (ContextVars) logimine: Moodul
contextvars(saadaval Python 3.7+) vÔimaldab salvestada kontekstispetsiifilisi andmeid (nt pÀringu ID-d, kasutaja ID-d) ja lisada need automaatselt oma logisÔnumitesse. See lihtsustab kontekstuaalse teabe lisamist oma logidesse, ilma et peaksite seda kÀsitsi igale logimiskutsele edasi andma. See vÀhendab korduvkoodi ja parandab koodi hooldatavust. - Logimisfiltrid: Kasutage filtreid, et veelgi tÀpsemalt mÀÀrata, milliseid logisÔnumeid kÀsitlejad töötlevad. Filtreid saab nÀiteks kasutada logisÔnumite tingimuslikuks logimiseks kohandatud kriteeriumide alusel, nagu pÀritolumoodul vÔi konkreetse muutuja vÀÀrtus.
- Logimisteekide integreerimine: Integreerige oma logimine teiste oma projektis kasutatavate teekide ja raamistikega. NÀiteks kui kasutate veebiraamistikku nagu Flask vÔi Django, saate konfigureerida logimise automaatselt logima teavet HTTP-pÀringute ja vastuste kohta.
- Logide koondamine ja analĂŒĂŒs (ELK Stack jne): Rakendage logide koondamise sĂŒsteem. Kaaluge ELK stack'i (Elasticsearch, Logstash, Kibana) vĂ”i teiste pilvepĂ”histe lahenduste kasutamist. Need sĂŒsteemid vĂ”imaldavad teil koguda, tsentraliseerida ja analĂŒĂŒsida logisid erinevatest allikatest, pakkudes vĂ”imsaid otsingu-, filtreerimis- ja visualiseerimisvĂ”imalusi. See parandab teie vĂ”imet tuvastada suundumusi, avastada anomaaliaid ja otsida vigu.
- JĂ€litamine ja hajusjĂ€litamine (Tracing): Mikroteenuste vĂ”i hajusaarkitektuuriga rakenduste puhul rakendage jĂ€litamist, et jĂ€lgida pĂ€ringuid, kui need liiguvad lĂ€bi mitme teenuse. Teegid nagu Jaeger, Zipkin ja OpenTelemetry aitavad jĂ€litamisel. See vĂ”imaldab teil korreleerida logisĂ”numeid erinevate teenuste vahel, pakkudes ĂŒlevaadet teie rakenduse otsast-lĂ”puni kĂ€itumisest ja tuvastades jĂ”udluse kitsaskohti keerukates hajussĂŒsteemides.
KokkuvÔte: edu nimel logimine
TÔhus logimine on tarkvaraarenduse fundamentaalne aspekt. Pythoni logimisraamistik pakub teile vajalikud tööriistad, et rakendada oma rakendustes pÔhjalikku logimist. MÔistes kÀsitlejate konfigureerimist, kohandatud vormindajaid ja parimaid tavasid, saate luua robustseid ja tÔhusaid logimislahendusi, mis vÔimaldavad teil:
- TÔhusalt siluda: Leida probleemide algpÔhjus kiiremini.
- JĂ€lgida rakenduse seisundit: Tuvastada ennetavalt potentsiaalseid probleeme.
- Parandada rakenduse jĂ”udlust: Optimeerida oma koodi logimisest saadud ĂŒlevaadete pĂ”hjal.
- Saada vÀÀrtuslikke teadmisi: MÔista, kuidas teie rakendust kasutatakse.
- TÀita regulatiivseid nÔudeid: Vastata logimis- ja auditeerimisstandarditele.
Olenemata sellest, kas olete oma teekonda alustav nooremarendaja vĂ”i kogenud professionaal, kes ehitab suuremahulisi hajussĂŒsteeme, on kindel arusaam Pythoni logimisraamistikust hindamatu. Rakendage neid kontseptsioone, kohandage nĂ€iteid oma konkreetsetele vajadustele ja vĂ”tke omaks logimise jĂ”ud, et luua usaldusvÀÀrsemat ja hooldatavamat tarkvara globaalsel maastikul. JĂ€rjepidev logimine suurendab teie tootlikkust ja annab kriitilised teadmised, mida on vaja teie rakenduste edu tagamiseks.